/**
 * 微信小程序更新管理器
 * 解决iOS缓存问题，提供强制更新功能
 */

// 更新配置
const UPDATE_CONFIG = {
  // 是否强制更新（体验版建议开启）
  FORCE_UPDATE: true,
  // 更新检查间隔（毫秒）
  CHECK_INTERVAL: 5000,
  // 最大重试次数
  MAX_RETRY_COUNT: 3,
  // 更新提示文案
  MESSAGES: {
    CHECKING: '正在检查更新...',
    DOWNLOADING: '正在下载新版本...',
    READY: '新版本已准备好，重启应用即可体验新功能！',
    FAILED: '新版本下载失败，请检查网络连接后重试',
    MANUAL_UPDATE: '当前微信版本过低，建议升级微信后重试',
    FORCE_UPDATE: '检测到重要更新，请重启应用以继续使用'
  }
}

class UpdateManager {
  constructor() {
    this.updateManager = null
    this.retryCount = 0
    this.isUpdating = false
    this.lastCheckTime = 0
  }

  /**
   * 初始化更新管理器
   */
  init() {
    // #ifdef MP-WEIXIN
    try {
      if (wx.canIUse('getUpdateManager')) {
        this.updateManager = wx.getUpdateManager()
        this.bindEvents()
        console.log('更新管理器初始化成功')
        return true
      } else {
        console.warn('当前微信版本过低，不支持自动更新')
        this.showManualUpdateTip()
        return false
      }
    } catch (error) {
      console.error('初始化更新管理器失败:', error)
      return false
    }
    // #endif
  }

  /**
   * 绑定更新事件
   */
  bindEvents() {
    if (!this.updateManager) return

    // 监听检查更新结果
    this.updateManager.onCheckForUpdate((res) => {
      console.log('检查更新结果:', res)
      if (res.hasUpdate) {
        console.log('发现新版本，开始下载更新')
        this.showUpdateProgress()
        this.isUpdating = true
      } else {
        console.log('当前已是最新版本')
        this.isUpdating = false
      }
    })

    // 监听更新下载进度
    this.updateManager.onUpdateReady(() => {
      console.log('新版本下载完成，准备重启应用')
      this.isUpdating = false
      this.showUpdateReady()
    })

    // 监听更新失败
    this.updateManager.onUpdateFailed(() => {
      console.error('新版本下载失败')
      this.isUpdating = false
      this.retryCount++
      
      if (this.retryCount < UPDATE_CONFIG.MAX_RETRY_COUNT) {
        console.log(`更新失败，第${this.retryCount}次重试`)
        setTimeout(() => {
          this.checkForUpdate()
        }, UPDATE_CONFIG.CHECK_INTERVAL)
      } else {
        this.showUpdateFailed()
      }
    })
  }

  /**
   * 检查更新
   * @param {boolean} force - 是否强制检查（忽略时间间隔）
   */
  checkForUpdate(force = false) {
    // #ifdef MP-WEIXIN
    if (!this.updateManager) {
      console.warn('更新管理器未初始化')
      return
    }

    const now = Date.now()
    if (!force && now - this.lastCheckTime < UPDATE_CONFIG.CHECK_INTERVAL) {
      console.log('更新检查过于频繁，跳过本次检查')
      return
    }

    if (this.isUpdating) {
      console.log('正在更新中，跳过本次检查')
      return
    }

    try {
      this.lastCheckTime = now
      this.updateManager.checkForUpdate()
      console.log('开始检查更新...')
    } catch (error) {
      console.error('检查更新失败:', error)
    }
    // #endif
  }

  /**
   * 强制检查更新（用于解决iOS缓存问题）
   */
  forceCheckUpdate() {
    console.log('强制检查更新...')
    this.checkForUpdate(true)
  }

  /**
   * 显示更新进度
   */
  showUpdateProgress() {
    wx.showToast({
      title: UPDATE_CONFIG.MESSAGES.DOWNLOADING,
      icon: 'loading',
      duration: 2000
    })
  }

  /**
   * 显示更新就绪提示
   */
  showUpdateReady() {
    const modalConfig = {
      title: '更新提示',
      content: UPDATE_CONFIG.MESSAGES.READY,
      confirmText: '立即重启',
      cancelText: '稍后重启'
    }

    // 如果是强制更新，隐藏取消按钮
    if (UPDATE_CONFIG.FORCE_UPDATE) {
      modalConfig.showCancel = false
      modalConfig.content = UPDATE_CONFIG.MESSAGES.FORCE_UPDATE
    }

    wx.showModal({
      ...modalConfig,
      success: (res) => {
        if (res.confirm || UPDATE_CONFIG.FORCE_UPDATE) {
          this.applyUpdate()
        } else {
          this.showManualRestartTip()
        }
      }
    })
  }

  /**
   * 显示更新失败提示
   */
  showUpdateFailed() {
    wx.showModal({
      title: '更新失败',
      content: UPDATE_CONFIG.MESSAGES.FAILED,
      showCancel: false,
      confirmText: '我知道了'
    })
  }

  /**
   * 显示手动更新提示
   */
  showManualUpdateTip() {
    wx.showModal({
      title: '版本提示',
      content: UPDATE_CONFIG.MESSAGES.MANUAL_UPDATE,
      showCancel: false,
      confirmText: '我知道了'
    })
  }

  /**
   * 显示手动重启提示
   */
  showManualRestartTip() {
    wx.showToast({
      title: '请手动重启应用',
      icon: 'none',
      duration: 3000
    })
  }

  /**
   * 应用更新
   */
  applyUpdate() {
    if (!this.updateManager) {
      console.warn('更新管理器未初始化')
      return
    }

    try {
      this.updateManager.applyUpdate()
      console.log('正在应用更新...')
    } catch (error) {
      console.error('应用更新失败:', error)
      this.showUpdateFailed()
    }
  }

  /**
   * 获取更新状态
   */
  getUpdateStatus() {
    return {
      isUpdating: this.isUpdating,
      retryCount: this.retryCount,
      lastCheckTime: this.lastCheckTime
    }
  }

  /**
   * 重置更新状态
   */
  resetUpdateStatus() {
    this.retryCount = 0
    this.isUpdating = false
    this.lastCheckTime = 0
  }
}

// 创建单例实例
const updateManager = new UpdateManager()

export default updateManager
export { UpdateManager, UPDATE_CONFIG } 